Chore/dependency upgrade 2026 01 23 - #365
Conversation
- Deleted stale package-lock.json that referenced old robotjs/iohook - Regenerated with new @jitsi/robotjs and uiohook-napi dependencies - Updated karma-base.conf.js: karma-coverage-istanbul-reporter → karma-coverage - Renamed structure.type.d.ts → structure.type.ts for proper module export Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Update ElectronProvider API usage (provideIpcRenderer → provideElectronAPI) - Fix Angular Material mat-slider to new API with matSliderThumb input - Migrate _theme.scss to Angular Material v15+ theming with @use syntax - Fix JSON imports to use default imports instead of named exports - Add Subject<void> type parameters for RxJS strict mode - Add $any() casts for strict template type checking - Rename .d.ts type files to .ts for proper module exports - Remove deprecated Node.js util import (isNullOrUndefined) - Fix zone.js import path for newer version Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Add electron/preload.ts to tsconfig.serve.json so it gets compiled (preload is a separate entry point, never imported by main.ts) - Fix preload path in main.ts to always use electron/preload.js - Replace custom-electron-titlebar with HTML titlebar in settings window (window.require() unavailable with contextIsolation: true) - Add cross-window IPC forwarding in main.ts for thread control channels (thread-pause, settings-changed, etc.) - Add missing channels to preload send() whitelist Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Use cross-env for NODE_OPTIONS in package.json scripts (cross-platform) - Fix ESLint/TSLint errors: switch-case scoping, strict equality, Object -> object type, no-input-rename directive - Fix RxJS variable hoisting issues in stash-grid.service.ts - Fix async pipe negation in evaluate-dialog template - Update test infrastructure: remove require.context, add mock ElectronAPI and LocalForage providers, add test specs for services - Add @app/testing path alias in tsconfig.json Co-Authored-By: Claude Opus 4.6 <[email protected]>
When windowSetAlwaysOnTop(false) is called without a level, the preload sends undefined as the level arg. Electron 28's native setAlwaysOnTop validates arg 2 as a string when 3 args are passed, throwing "A string was expected". Only pass level/relativeLevel when level is truthy. Also harden shell-open-external and log handlers with type guards. Co-Authored-By: Claude Opus 4.6 <[email protected]>
The old custom robotjs fork accepted Windows virtual key codes as numbers (e.g. 0x43 for 'C'). The new @jitsi/robotjs requires string key names (e.g. 'c'). Add a VK-to-key-name mapping to convert numeric codes before passing them to robotjs. Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Replace debounce(() => EMPTY) with debounce(() => timer(0)) in overlay visibility pipeline. RxJS 7 changed debounce behavior: inner observable completion no longer emits buffered values, causing window.show() to never fire. - Add font:inherit to item-frame-value-input so ch-based width calculation matches the actual rendered font, fixing clipped stat numbers. - Fix requestAccessibility() crash guard for non-macOS platforms. - Fix send() error handler referencing wrong variable name (args vs additionalArgs). - Add debug logging for game detection, shortcut registration, and window show/hide (throttled to avoid log spam). Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Use showInactive() instead of show() for the overlay window to prevent stealing focus from PoE, which caused a rapid active/inactive flashing loop. - Coerce poe.active to boolean (!!poe.active) before sending via IPC to avoid Electron 28 serialization failure on undefined values. Co-Authored-By: Claude Opus 4.6 <[email protected]>
…ections Update all CSS selectors from legacy .mat-* to .mat-mdc-* for Angular Material v15+ MDC migration. Fix unhandled promise rejections in auto-updater and main process (loadURL, shell.openExternal). Fix isMinimized property→method call, child window close handler null safety, and tray double-click crash. Co-Authored-By: Claude Opus 4.6 <[email protected]>
Only apply the custom PoEOverlayCommunityFork user-agent to API and XHR requests. Page loads (login, trade search) now use the default Chromium user-agent, preventing Cloudflare from flagging them as bot traffic. Co-Authored-By: Claude Opus 4.6 <[email protected]>
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Cloudflare's JS challenge also checks navigator.userAgent, not just the HTTP header. Remove "Electron/x.x.x" and "poe-overlay/x.x.x" from the in-page user agent on spawned BrowserWindows so login pages pass Cloudflare verification. Co-Authored-By: Claude Opus 4.6 <[email protected]>
… import Cloudflare Turnstile blocks Electron's embedded browser from completing verification. Instead, open the PoE login page in the user's default browser and let them paste their POESESSID cookie to authenticate. Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Bump version 0.8.39 → 0.9.0 to reflect the major dependency upgrade (Electron 8→28, Angular 9→17, new IPC architecture, native module replacements) - Add CHANGELOG entry for 0.9.0 - Fix evaluate-dialog: default privateLeague$ to false; add null-safety and error handler in checkPrivateLeague() so a failed league lookup doesn't leave the flag in an incorrect state Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- karma-base.conf.js: add headless Chrome flags for WSL compatibility
- spec_helper.spec.ts: add global beforeEach(resetTestingModule) so the
TestBed instantiated by beforeAll doesn't block the first spec from
calling configureTestingModule
- mock-electron-api.ts: add missing setSessionCookie/getSessionCookie spies
- 7 component specs: migrate ElectronProviderFake from Electron 8 IPC API
(provideRemote/provideIpcRenderer) to new provideElectronAPI()
- user-settings-form.component.spec.ts: use MockElectronProvider instead of
null-returning fake (AppService.isAutoLaunchEnabled calls electronAPI.once)
- evaluate-dialog.component.spec.ts: fix MatDialogRef null -> {close: ()=>{}}
- item-price-prediction.service.spec.ts: correct mock currencyId 'exalted'
-> 'exa' to match mock data; add leagueId: 'Delirium' to context init
- item-search-analyze.service.spec.ts: add leagueId: 'Delirium' to context init
- window.service.spec.ts: add explicit resetTestingModule in beforeEach
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
|
ack, will review in detail after league launch dies down. incredible work @ezroar |
| this.electronAPI.registerGlobalShortcut(shortcut.accelerator) | ||
| } else { | ||
| this.electronAPI.registerGlobalShortcut(shortcut.accelerator) | ||
| this.electronAPI.on(`shortcut-${shortcut.accelerator}`, () => { |
There was a problem hiding this comment.
I'm not sure on this part of the code, it seems like there's no longer a difference between passive and non-passive shortcuts.
If it's intended, then the entire passive variable should be removed.
Obviously all passive features need to be tested (I think it's only the mouse wheel scrolling for stash tabs; if that no longer works, we should remove the feature).
There was a problem hiding this comment.
This file should probably be removed before merge
There was a problem hiding this comment.
The versions in this file seem wrong.
Node 12 doesn't match versions mentioned above. I would expect 18+.
I would also guess Python 3? We should investigate this file
There was a problem hiding this comment.
I'm removing this file, there's a more generic developer readme anyway.
|
|
||
| Due to the scope of changes, manual testing is critical: | ||
|
|
||
| ### Basic Functionality |
There was a problem hiding this comment.
Some of these aren't X'd off Does that mean it failed testing?
There was a problem hiding this comment.
Not sure, we'll be testing it anyway before publishing an alpha. On a side note, I'm removing this .md file and moving the contents to the PR body instead
| } | ||
| }) | ||
|
|
||
| this.electronAPI.once('browser-window-ready', (_, id) => { |
There was a problem hiding this comment.
this was already set on line 68?
There was a problem hiding this comment.
Different method (open vs openAndWait) -> i.e. both are needed and should stay.
| <div class="col-4"> | ||
| <mat-form-field> | ||
| <mat-label>POESESSID</mat-label> | ||
| <input matInput [(ngModel)]="poesessid" type="password" /> |
There was a problem hiding this comment.
what are we doing with the SESSID?
There was a problem hiding this comment.
nvm, i see below. an alternative way of logging in.
There was a problem hiding this comment.
No, we will not be adding poesessid support because this is highly discouraged/"forbidden" by GGG.
| */ | ||
| public showStashGrid(...stashGridOptions: StashGridOptions[]): Observable<boolean> { | ||
| const promise = new Promise<boolean>((resolve, reject) => { | ||
| let sub: Subscription |
There was a problem hiding this comment.
naming the subscriptions would be helpful for later
Description
This madlad did the unthinkable and upgraded the stack. Praise to this guy and this detailed summary of the changes made:
https://github.com/ezroar/PoE-Overlay-Community-Fork/blob/chore/dependency-upgrade-2026-01-23/UPGRADE-SUMMARY.md